Una firma digitale "abbastanza buona", con chiave breve

4

Nella mia applicazione, voglio nascondere la funzione di debug dietro una password. Non voglio che la password sia facilmente nota con l'emissione di strings executable , quindi voglio fare affidamento sulla firma digitale.

Vogliamo che Debbie sia in grado di eseguire il debug del programma.

Lo schema principale è:

  1. Dai la chiave privata RSA a Debbie, inserisci public RSA key nel programma.
  2. Assegna un numero casuale sig a Debbie e inseriscilo nel programma.
  3. Debbie "crittografa" sig con la chiave privata e accede alle funzioni di debug tramite l'url /debug/<base64_encoded_encrypted_sig>
  4. Il software verificherà che "decodifica" il numero scritto da Debbie nell'URL, restituisce sig e quindi consente l'accesso alle funzioni di debug.

Perché uso solo RSA e non uno standard di firma noto (come PGP ecc.)?

Il motivo è che una firma tipica è troppo lunga. Anche 256 bit è lungo e assomiglia a:

RS69BdGmd7330TNZU0Wk46VbTHvGLE46hIiy2ecHFX4T

Quindi la mia domanda è: il mio schema è abbastanza sicuro?

update: anche le chiavi da 256 bit sono banali da considerare, quindi la risposta è probabilmente, questa non è la strada da percorrere.

    
posta Elazar Leibovich 15.01.2012 - 09:27
fonte

4 risposte

5

Nessuno schema come questo impedisce ad un determinato attaccante di attivare la "funzione di debug", con il semplice espediente del reverse engineering del codice per individuare la parte che, nel codice del software, assomiglierà a:

if (is_good_password(password)) {
    activate_debug();
}

e trasformalo in:

if (true) {
    activate_debug();
}

che di solito è solo una questione di trasformare un salto condizionato in un salto incondizionato, o un non salto incondizionato (cioè un nop opcode). Non è nemmeno difficile da fare, anche in grandi software (ad es. L'ho fatto una volta per Windows 2000, per consentire di testare un personalizzato CSP - CSP deve essere firmato, e la soluzione fornita da Microsoft per disattivare la verifica della firma sulle piattaforme di sviluppo era valida solo fino a Win2k SP2, o WinXP, mentre avevo un Win2k SP4, quindi dovevo hackerare il advapi32.dll , che mi ha richiesto 3 ore).

Detto questo, se vuoi solo verificare una password, il modo più semplice è di memorizzare nel tuo software un token di verifica della password, cioè un valore hash calcolato sulla password. Non c'è bisogno di portare tutto l'armamentario delle firme digitali! Solo un semplice hash, e questo può ospitare password di qualsiasi lunghezza. Il software incorpora il valore hash; quando viene inserito l'URL "debug", blocca la parte dopo " debug/ " e vede se corrisponde al valore hash registrato. Pertanto, la password non appare nel codice software stesso (né in testo chiaro, o semplicemente "codificato"), e puoi usare una "password" abbastanza breve da essere digitata.

Le firme digitali vanno bene solo se hai un numero illimitato di "Debbies", e vuoi essere in grado di dare una "password di debug" a ogni Debbie, in modo che ogni Debbie abbia la sua password distinta dalle password date agli altri Debbies, e volete rendere impossibile una Debbie malvagia, indipendentemente da quanto ingegneria inversa, per ricalcolare le altre password da quella che lei ha già (se hai solo, diciamo, 20 Debbies, puoi includere solo 20 valori hash nel tuo codice; per "illimitato" intendo "potenzialmente milioni"). Questo è uno scenario piuttosto specifico. Un esempio sono le "chiavi del prodotto": le firme digitali potrebbero teoricamente vanificare i generatori di chiavi del prodotto. Tuttavia, la firma digitale più potente non farà meglio di un hash della password contro un utente malintenzionato che esegue alcune ore di reverse engineering sul codice per individuare l'opcode di salto condizionale corretto. La firma non protegge contro l'accesso illecito al codice di debug; protegge solo contro estendendo un accesso illecito a una scala industriale, assegnandolo a molti altri clienti senza richiedere una modifica locale del codice - un cosiddetto "hack" .

Per la funzione di hash, in caso di dubbio, usa SHA-256 - se (e solo se) la "password" è lunga e abbastanza casuale (ad esempio 128 bit casuali). Se alla Debbie è permesso scegliere una password "significativa" (una che un essere umano sarà in grado di ricordare, invece di averla scritta su un pezzo di carta), allora dovresti usare una funzione di hash che resiste agli attacchi del dizionario, per esempio PBKDF2 o bcrypt .

Non utilizzare la modalità "criptare con la chiave privata" per descrivere una firma; è una spiegazione terribile, che non funziona per tutti gli algoritmi di firma. È solo un modo storico con cui RSA è stato presentato per la prima volta, ma anche per RSA è sbagliato: non ci vuole padding in considerazione e il padding è essenziale per la sicurezza (vedi PKCS # 1 ). Lascia perdere. Non c'è niente di sbagliato in "usare la chiave privata per firmare alcuni dati" e "usare la chiave pubblica per verificare alcuni dati".

    
risposta data 15.01.2012 - 16:48
fonte
0

Il factoring di una chiave rsa a 74 bit può essere fatto con wolfram alpha , 256 bit di solito impiega circa circa un'ora compresa la compilazione del codice, quindi stai andando a fare una rapida chiave cambiando un intero lotto helluva.

Quello che suggerirei di fare è usare un sistema di firma molto diverso, sia ECDSA che idealmente BLS. ECDSA hai ancora la lunghezza di hash 4t. Tuttavia, la lunghezza della chiave cambia la lunghezza della firma. Il tuo altro enorme problema è che, a meno che tu non usi RSA-PSS, hai a che fare con un set completo di mal di testa, su come tamponare correttamente i tuoi messaggi.

Tuttavia, c'è qualcosa di un po 'diverso che in realtà è davvero carino chiamato BLS, è uno schema di firma basato sull'abbinamento. Se non ti devi preoccupare di fastidiosi sistemi legacy, probabilmente è la soluzione migliore, link è una libreria che ha implementato tutti i bls come esempio e rende la vita abbastanza facile.

Ti permetterebbe anche di non dover cambiare le chiavi da quando finirai con una chiave a 384 bit che avrai una chiave privata molto strong, poiché si basa su un problema diverso. RSA è la fattorizzazione di interi qui nel tuo in curva è una metrica di forza diversa.

ECDSA ti darà un margine di sicurezza molto maggiore, poiché è randomizzato e le chiavi sono molto più difficili da trovare. È un po 'più complesso, ma le attuali previsioni sulla dimensione delle chiavi sono solo di gran lunga piccole.

La tua migliore scommessa se vuoi fare qualcosa di simile è usare uno schema di firma breve come BLS, il loro raro e un po 'difficile da capire all'inizio, ma è il modo in cui la crittografia si sta muovendo.

    
risposta data 15.01.2012 - 11:32
fonte
0

Se vuoi firme compatte devi guardare ECDSA. RSA è piuttosto orribile se key & la dimensione della firma è importante. Non ho idea di quale forza chiave abbia una chiave RSA a 256 bit, ma anche la chiave a 1.024 bit ha solo una resistenza di 80 bit e richiede una chiave da 15,360 bit per raggiungere una potenza di 256 bit.

Le firme ECDSA non elaborate sono 2x la lunghezza della chiave come r & s sono uguali alla lunghezza della chiave privata. È richiesta una lunghezza della chiave pari a 2x la forza del bit. Quindi per la sicurezza a 80 bit stai guardando una firma a 320 bit.

Per evitare un attacco di replay il messaggio firmato non dovrebbe essere un numero statico ma piuttosto un nonce casuale. Se lo fai da urls, potrebbe essere un semplice accesso come / debug il software restituirà un messaggio univoco per Debbie da firmare.

Se la dimensione della firma più piccola è davvero necessaria, puoi scambiare bit per il tempo di verifica ma non ti farà risparmiare molto dato che le verifiche della firma ECDSA sono già lente (puoi ottenere qualcosa nell'ordine di 2 ^ 16 rilevazioni sig al secondo per core sulla CPU moderna).

    
risposta data 30.06.2015 - 18:40
fonte
-3

Puoi usare una firma lunga (ad esempio 256 bit), ma solo l'essere umano inserire una firma breve (ad esempio 128 bit)!

Semplicemente generare la firma di bit N (ad esempio 256) come normale, quindi mostrare all'essere umano i primi bit M (ad esempio 128). Quindi il programma di controllo può scorrere tutte le combinazioni di code di bit (N-M) aggiunte ai bit M che l'umano ha inserito. Certo, ci vorrà più tempo per controllare il programma di controllo, ma va bene (forse anche bene).

    
risposta data 16.08.2012 - 09:56
fonte

Leggi altre domande sui tag